import { Cartesian3, Color, GeoJsonDataSource, MaterialProperty, PolygonHierarchy, Polyline, PolylineCollection, PolylineOutlineMaterialProperty, Viewer } from "cesium";
import BillboardCollection from "cesium/Source/Scene/BillboardCollection";

export type AddHolePolygonEntityOption = {
    holePositions: number[], 
    polygonPositions?: number[], 
    material?: MaterialProperty | Color
}

/**
 * 几何体工具类
 */
export class GeometryUtils {
    polylineCollection: PolylineCollection
    constructor(private viewer: Viewer) {
        this.polylineCollection = this.viewer.scene.primitives.add(new PolylineCollection());
    }
    /**
     * 加载geojson
     * @param loadOption 设置geojson数据绘制的样式
     * {
        sourceUri?: string; -重写用于解析相对链接的url。
        describe?: GeoJsonDataSource.describe; -返回Property对象（或字符串）的函数。
        markerSize?: number;-为每个点创建的贴图接点的默认大小（以像素为单位）。
        markerSymbol?: string;-为每个点创建的地图接点的默认符号。
        markerColor?: Color;-为每个点创建的贴图接点的默认颜色。
        stroke?: Color;-多段线和多边形轮廓的默认颜色。
        strokeWidth?: number;-多段线和多边形轮廓的默认宽度。（这个没用，因为被限制住了，最大只能是1，参考issues：https://github.com/CesiumGS/cesium/issues/6942）
        fill?: Color;-多边形内部的默认颜色。
        clampToGround?: boolean;-如果我们希望几何特征（多边形或线字符串）固定在地面上，则为true。
        credit?: Credit | string;-画布上显示的数据源信用。
       }
     * @returns geojson对象加载进入viewer.dataSources完成的promise
     */
    async addGeojson(url: string, loadOption: GeoJsonDataSource.LoadOptions = {}) {
        const datasource = await this.viewer.dataSources.add(
            GeoJsonDataSource.load(url, loadOption)
        );
        return datasource;
    }
    /**
     * 以entity的方式加载polyline
     */
    addPolylinePrimities(option: any): Polyline {
        return this.polylineCollection.add(option)
    }
    /**
     * 绘制反选遮罩
     * @param holePositions 
     * @param polygonPositions 
     */
    addHolePolygonEntity(option: AddHolePolygonEntityOption) {
        option = Object.assign({
            polygonPositions: [100, 0, 100, 89, 150, 89, 150, 0],
            material: Color.BLACK.withAlpha(0.4)
        }, option)
        let cs = Cartesian3.fromDegreesArray(option.holePositions);
        let hole = new PolygonHierarchy(cs);
        this.viewer.entities.add({
            name: "convertLayer",
            polygon: {
                hierarchy: {
                    positions: Cartesian3.fromDegreesArray(option.polygonPositions as number[]),
                    holes: [hole],
                },
                material: option.material,
            },
        });
    }
}